using System;
using System.Collections.Generic;
using System.Data;
using MySql.Data.MySqlClient;
using System.Security.Cryptography;

using System.Text;

namespace NEX_Datos
{
    public abstract class UtilidadAD
    {

        private static MySqlCommand fSqlCommand;

        public static MySqlCommand SqlCommandObtener()
        {
            if (UtilidadAD.fSqlCommand == null)
            {
                /**********************************************/
                #region Para la encriptacion de la clave del connection

                Int32 indicePDW = 4;
                //String key = "JkkRFrXnjbXKmbdQOPjNDaQBHt4YGWvv5/T2Vg7Tt9A=";
                String key = "5Kcd1CD229ww+VOZniWV3OJoGPh2oSsRxkSnZgDjju0=";
                
                RijndaelManaged alg = new RijndaelManaged();
                ServicioEncriptacionRIJ.Alg = alg;
                //alg.IV = Convert.FromBase64String("Z76e4grJStZOZs42Pe5xrQ==");
                alg.IV = Convert.FromBase64String("kDH4hw1ixEAxeZ5ZpuYX+Q==");
                
                ServicioEncriptacionRIJ.Key = key;
                String connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MySqlComunidadLibros"].ToString();

                string[] claves = connectionString.Split(';');
                String pwd, clave;
                pwd = claves[indicePDW];
                clave = (pwd.Split('='))[1];
                pwd = "Pwd=" + ServicioEncriptacionRIJ.Desencriptar(clave + "==");
                claves[indicePDW] = pwd.Replace('\0', ' ').Trim();

                connectionString = claves[0] + ";" + claves[1] + ";" + claves[2] + ";" + claves[3] + ";" + claves[4];
                #endregion
                /**********************************************/

                UtilidadAD.fSqlCommand = new MySqlCommand();
                UtilidadAD.fSqlCommand.Connection = new MySqlConnection(connectionString);
                UtilidadAD.fSqlCommand.Connection.Open();
                UtilidadAD.fSqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
            }
            else
            {
                if (UtilidadAD.fSqlCommand.Connection.State == System.Data.ConnectionState.Closed)
                {
                    UtilidadAD.fSqlCommand.Connection.Open();
                }
                UtilidadAD.fSqlCommand.Parameters.Clear();
            }
            return UtilidadAD.fSqlCommand;
        }

        public static MySqlCommand CreateSqlCommand()
        {
            MySqlCommand unSqlCommand;
            /**********************************************/
            #region Para la encriptacion de la clave del connection

            Int32 indicePDW = 4;
            //String key = "5Kcd1CD229ww+VOZniWV3OJoGPh2oSsRxkSnZgDjju0=";
            String key = "BjfwBdsM3utUtIERKzB3hKm8hV1V0uivXgFb3ZIv6us=";
            RijndaelManaged alg = new RijndaelManaged();
            ServicioEncriptacionRIJ.Alg = alg;
            //alg.IV = Convert.FromBase64String("kDH4hw1ixEAxeZ5ZpuYX+Q==");
            alg.IV = Convert.FromBase64String("xgMAHwildWiSRuMbjocFAg==");
            ServicioEncriptacionRIJ.Key = key;
            String connectionString = System.Configuration.ConfigurationManager.ConnectionStrings["MySqlComunidadLibros"].ToString();

            string[] claves = connectionString.Split(';');
            String pwd, clave;
            pwd = claves[indicePDW];
            clave = (pwd.Split('='))[1];
            pwd = "Pwd=" + ServicioEncriptacionRIJ.Desencriptar(clave + "==");
            claves[indicePDW] = pwd.Replace('\0', ' ').Trim();

            connectionString = claves[0] + ";" + claves[1] + ";" + claves[2] + ";" + claves[3] + ";" + claves[4];
            #endregion
            /**********************************************/

            unSqlCommand = new MySqlCommand();
            unSqlCommand.Connection = new MySqlConnection(connectionString);
            unSqlCommand.Connection.Open();
            unSqlCommand.CommandType = System.Data.CommandType.StoredProcedure;

            return unSqlCommand;
        }

        public static DateTime FechaObtener()
        {
            DateTime fecha;

            using (DataSet ds = new DataSet())
            {
                ds.Locale = System.Globalization.CultureInfo.CurrentCulture;
                using (MySqlCommand cmd = UtilidadAD.CreateSqlCommand())
                {
                    cmd.CommandText = "Fecha_Obtener";
                    using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
                    {
                        da.Fill(ds);
                    }
                }
                fecha = DateTime.Parse(ds.Tables[0].Rows[0]["FechaActual"].ToString(), System.Globalization.CultureInfo.CurrentCulture);
            }
            return fecha;
        }
    }

    [Serializable]
    public class AccesoDatosExceptionAD : Exception
    {

        public AccesoDatosExceptionAD()
            : base()
        {
        }

        public AccesoDatosExceptionAD(String mensaje)
            : base(mensaje)
        {
        }

        protected AccesoDatosExceptionAD(System.Runtime.Serialization.SerializationInfo informacion,
            System.Runtime.Serialization.StreamingContext contexto)
            : base(informacion, contexto)
        {
        }

        public AccesoDatosExceptionAD(String mensaje, Exception excepcionInterna)
            : base(mensaje, excepcionInterna)
        {
        }

    }

    [Serializable]
    public class ActualizacionExceptionAD : AccesoDatosExceptionAD
    {

        public ActualizacionExceptionAD()
            : base()
        {
        }

        public ActualizacionExceptionAD(String mensaje)
            : base(mensaje)
        {
        }

        protected ActualizacionExceptionAD(System.Runtime.Serialization.SerializationInfo informacion,
            System.Runtime.Serialization.StreamingContext contexto)
            : base(informacion, contexto)
        {
        }

        public ActualizacionExceptionAD(String mensaje, Exception excepcionInterna)
            : base(mensaje, excepcionInterna)
        {
        }

    }

    [Serializable]
    public class ClaveDuplicadaExceptionAD : ActualizacionExceptionAD
    {
        public const int ClaveDuplicadaExceptionNumber = 2627;

        public ClaveDuplicadaExceptionAD()
            : base()
        {
        }

        public ClaveDuplicadaExceptionAD(String mensaje)
            : base(mensaje)
        {
        }

        protected ClaveDuplicadaExceptionAD(System.Runtime.Serialization.SerializationInfo informacion,
            System.Runtime.Serialization.StreamingContext contexto)
            : base(informacion, contexto)
        {
        }

        public ClaveDuplicadaExceptionAD(String mensaje, Exception excepcionInterna)
            : base(mensaje, excepcionInterna)
        {
        }

    }

    [Serializable]
    public class ClaveDuplicadaCompuestaExceptionAD : ActualizacionExceptionAD
    {
        public const int ClaveDuplicadaExceptionNumber = 2601;

        public ClaveDuplicadaCompuestaExceptionAD()
            : base()
        {
        }

        public ClaveDuplicadaCompuestaExceptionAD(String mensaje)
            : base(mensaje)
        {
        }

        protected ClaveDuplicadaCompuestaExceptionAD(System.Runtime.Serialization.SerializationInfo informacion,
            System.Runtime.Serialization.StreamingContext contexto)
            : base(informacion, contexto)
        {
        }

        public ClaveDuplicadaCompuestaExceptionAD(String mensaje, Exception excepcionInterna)
            : base(mensaje, excepcionInterna)
        {
        }

    }
    [Serializable]
    public class ReferenciaExceptionAD : AccesoDatosExceptionAD
    {

        public const int ForeingKeyExceptionNumber = 547;

        public ReferenciaExceptionAD()
            : base()
        {
        }

        public ReferenciaExceptionAD(String mensaje)
            : base(mensaje)
        {
        }

        protected ReferenciaExceptionAD(System.Runtime.Serialization.SerializationInfo informacion,
            System.Runtime.Serialization.StreamingContext contexto)
            : base(informacion, contexto)
        {
        }

        public ReferenciaExceptionAD(String mensaje, Exception excepcionInterna)
            : base(mensaje, excepcionInterna)
        {
        }

    }

    [Serializable]
    public class TimeOutExceptionAD : AccesoDatosExceptionAD
    {

        public const int TimeOutExceptionNumber = -2;

        public TimeOutExceptionAD()
            : base()
        {
        }

        public TimeOutExceptionAD(String mensaje)
            : base(mensaje)
        {
        }

        protected TimeOutExceptionAD(System.Runtime.Serialization.SerializationInfo informacion,
            System.Runtime.Serialization.StreamingContext contexto)
            : base(informacion, contexto)
        {
        }

        public TimeOutExceptionAD(String mensaje, Exception excepcionInterna)
            : base(mensaje, excepcionInterna)
        {
        }

    }

}
